home *** CD-ROM | disk | FTP | other *** search
/ Ray Dream Studio 5 / Ray Dream.iso / pc / DreamSDK / Macintosh / Samples / gel / GEL / COMGEL.cpp next >
Encoding:
Text File  |  1997-07-09  |  3.5 KB  |  143 lines

  1. // Copyright (c)1995 Ray Dream, Inc. All Rights Reserved.
  2. /* $Id: COMGEL.cpp 1.5 1997/04/10 23:29:09 damien Exp $ */
  3.  
  4. ////////////////////////////////////////////////////////////////////////
  5. //   First Gel Example : Gel Light                                    //
  6. //--------------------------------------------------------------------//
  7. //   Implementation of the Gel Interface                              //
  8. //////////////////////////////////////////////////////////////////////// 
  9.  
  10. #include "math.h"
  11.  
  12. #ifndef __COMGEL__
  13. #include "COMGEL.h"
  14. #endif
  15.  
  16. #ifndef __GELDLL__
  17. #include "GelDLL.h"
  18. #endif
  19.  
  20. #ifndef __3DCOFAIL__
  21. #include "3DCoFail.h"
  22. #endif
  23.  
  24. #undef INTERFACE
  25. #define INTERFACE GelLight
  26.  
  27. // Constructor / Destructor of the C++ Object :
  28. GelLight::GelLight() {
  29.   fCRef=0;  // Reference counter
  30.   // Data initialization :
  31.   fData.fNbBranches=5;
  32.   }
  33.   
  34. GelLight::~GelLight() {
  35.   global_count_Obj--; 
  36.   }
  37.   
  38. // IUnknown Interface :
  39. HRESULT GelLight::QueryInterface(THIS_ REFIID riid,LPVOID* ppvObj) {
  40.   *ppvObj=NULL;
  41.   
  42.   // The GelLight knows the interfaces of the parent Objects
  43.   if (IsEqualIID(riid, IID_IUnknown))
  44.     *ppvObj=(LPVOID)this;
  45.   else if (IsEqualIID(riid, IID_I3DExLightsourceGel))
  46.     *ppvObj=(LPVOID)this;
  47.   else if (IsEqualIID(riid, IID_I3DExDataExchanger))
  48.     *ppvObj=(LPVOID)this;
  49.   else if (IsEqualIID(riid, IID_I3DExtension))
  50.     *ppvObj=(LPVOID)this;
  51.     
  52.   // we must add reference if we return an interface
  53.   if (*ppvObj!=NULL) {
  54.     ((LPUNKNOWN)*ppvObj)->AddRef();
  55.     return NOERROR;
  56.     }
  57.   else {
  58.     return ResultFromScode(E_NOINTERFACE);
  59.     }
  60.   }
  61.  
  62. ULONG GelLight::AddRef(THIS) {
  63.   return fCRef++;
  64.   }
  65.   
  66. ULONG GelLight::Release(THIS) {
  67.   ULONG UnreleaseObject=fCRef--;
  68.   
  69.   if (fCRef==0)
  70.      delete this; // No reference left so delete the object
  71.   
  72.   return UnreleaseObject;
  73.    // Use local variable because if the object is destructed
  74.    // fCRef do not exist
  75.   }
  76.   
  77. // I3DExtension methods :
  78. I3DExtension* GelLight::Clone(THIS) {
  79.   GelLight* theClone = new GelLight;
  80.   if (theClone) {
  81.     theClone->AddRef();
  82.     theClone->fData=fData;
  83.     }                               
  84.   return theClone;
  85.   }
  86.      
  87. HRESULT GelLight::ShellUtilitiesInit(THIS_ IShUtilities* shellUtilities) {
  88.   InitCoFailure(shellUtilities);
  89.   return NOERROR;
  90.   }
  91.  
  92.   
  93. // I3DExDataExchanger methods :
  94. ExtensionDataMap* GelLight::GetExtensionDataMap(THIS) {
  95.   return NULL;
  96.   }               
  97.   
  98. void* GelLight::GetExtensionDataBuffer(THIS) {
  99.   return &fData; // The Shell uses this pointer to set the values of the Gel's parameters
  100.   }
  101.   
  102. HRESULT GelLight::ExtensionDataChanged(THIS) {          
  103.   return NOERROR;
  104.   }
  105.  
  106. HRESULT GelLight::HandleEvent(THIS_ ULONG SourceID) {
  107.   return ResultFromScode(E_NOTIMPL);
  108.   }
  109.  
  110. short GelLight::GetResID(THIS) {
  111.   return 133; // This is the view ID in the resource file
  112.   }
  113.   
  114. NUM3D kPI=3.1415926535897932384626233;
  115.  
  116. // I3DExLightsourceGel methods :
  117. BOOLEAN GelLight::GetGelValues(THIS_ VECTOR2D* gelScreenPosition,COLOR3D* result) {
  118.     NUM3D alpha;
  119.   NUM3D graylevel;
  120.   alpha=atan2((*gelScreenPosition)[1],(*gelScreenPosition)[0]); //QuickArcSinCos((*gelScreenPosition)[1],(*gelScreenPosition)[0],alpha);
  121.   alpha*=fData.fNbBranches;
  122.   
  123.   while (alpha<0.0) alpha+=kPI*2.0; // Modulo 2 pi
  124.   while (alpha>kPI*2.0) alpha-=kPI*2.0; // Modulo 2 pi
  125.   
  126.   if (alpha<kPI/2.0) {
  127.     graylevel=1.0-alpha/(kPI/2.0);
  128.     }
  129.   else if (alpha>kPI*1.5) {
  130.     graylevel=(alpha-kPI*1.5)/(kPI/2.0);
  131.     }
  132.   else {
  133.     graylevel=0.0; 
  134.     }
  135.   
  136.   result->Mode=0;
  137.   result->R=graylevel;
  138.   result->G=graylevel;
  139.   result->B=graylevel;
  140.  
  141.   return TRUE;
  142. }
  143.